package com.hackathon;

import java.util.List;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.hardware.SensorManager;
import android.location.LocationManager;
import android.location.LocationListener;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.LinearLayout.LayoutParams;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.util.Log;

import android.hardware.Sensor; //
import android.hardware.SensorEvent; // センサー用
import android.hardware.SensorEventListener; //
import android.hardware.SensorListener;
import android.hardware.SensorManager; //

public class DRadarActivity extends MapActivity implements LocationListener, SensorEventListener {

	// メニューのID
	private static final int MENU_ID_SEARCH = Menu.FIRST;
	private static final int MENU_ID_RADAR = Menu.FIRST + 1;
	private static final int MENU_ID_HELP = Menu.FIRST + 2;
	private static final int MENU_ID_EXIT = Menu.FIRST + 3;

	private MyMapView mapView;
	private DRadarView view;

	private EditText edit;
	private SeekBar seekBar;

	private GeoPoint geo;
	private LocationManager locManager;
	double lat, lng;

	// センサー用変数
	private boolean mRegisteredSensor;
	private SensorManager mSensorManager;

	/**
	 * アプリ起動時に呼ばれる
	 */
	@Override
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	
    	FrameLayout frameLayout = new FrameLayout(this);
    	setContentView(frameLayout);
    	//setContentView(R.layout.main);
    	
    	//Google Map
    	mapView = new MyMapView(this, "0adEDIB-gw_CP5ybUOCGR-xPoQMjMhNBlmD3aJQ");
    	mapView.setEnabled(true);
    	mapView.setClickable(true);
    	frameLayout.addView(mapView, new LinearLayout.LayoutParams(
        		LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    	
    	//レーダー画面です
    	/*
    	view = new DRadarView(this);
        frameLayout.addView(view, new LinearLayout.LayoutParams(
        		LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));    
        */
    	
        //GPS取得
        locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
        
        lat = 35.68198003744061;
        lng = 139.76609230041504;
        geo = new GeoPoint(
				new Double(lat * 1E6).intValue(), 
				new Double(lng * 1E6).intValue());
        MapController controller = mapView.getController();

		controller.setCenter(geo);

		// センサー初期化
		mRegisteredSensor = false;
		mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
	}

	/**
	 * レジューム時に実行
	 */
	@Override
	protected void onResume() {
		super.onResume();
		{
			// センサーの作成
			List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);

			if (sensors.size() > 0) {
				Sensor orientation = sensors.get(0);
				mRegisteredSensor = mSensorManager.registerListener(this, orientation, SensorManager.SENSOR_DELAY_FASTEST);
			}
		}
	}

	/**
	 * 一時停止時に実行
	 */
	@Override
	public void onStop() {
		super.onStop();

		// センサーの停止
		mSensorManager.unregisterListener(this);
	}

	/**
	 * 終了時に実行
	 */
	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	/**
	 * 	センサーの精度変更イベントの処理
	 */
	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {
	}

	/**
	 * センサーの値が変化したときに呼ばれる関数
	 */
	@Override
	public void onSensorChanged(SensorEvent event) {
		if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
			// デバッグ用 values[0]：方位 values[1]:z方向傾き values[2]:y方向傾き
			Log.v("ORIENTATION", String.valueOf(event.values[0]) + ", " + String.valueOf(event.values[1]) + ", " + String.valueOf(event.values[2]));
    		mapView.setRad(event.values[0]);
    		mapView.invalidate();
		}
	}

	/**
	 * 現在位置が変更したときに呼ばれる関数
	 */
	@Override
	public void onLocationChanged(Location location) {
		this.lat = location.getLatitude();
		this.lng = location.getLongitude();
		this.geo = new GeoPoint(new Double(lat * 1E6).intValue(), new Double(lng * 1E6).intValue());

		MapController controller = mapView.getController();
		controller.setCenter(geo);
	}

	
	 /**
	 * ルート情報を表示するかどうかを返す
	 * @see com.google.android.maps.MapActivity#isRouteDisplayed()
	 */
	@Override
	public boolean isRouteDisplayed() {
		return false;
	}

	/**
	 * GPSが使えなくなったときに呼び出される
	 */
	@Override
	public void onProviderDisabled(String provider) {
	}

	/**
	 * GPSが使えるようになったときに呼び出される
	 */
	@Override
	public void onProviderEnabled(String provider) {
	}

	/**
	 * GPSのステータスが変わったときに呼び出される
	 */
	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {
	}

	/**
	 * オプションメニューが最初に呼び出される時に1度だけ呼び出されます
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(Menu.NONE, MENU_ID_SEARCH, 0, "Search");
		menu.add(Menu.NONE, MENU_ID_RADAR, 1, "Radar");
		menu.add(Menu.NONE, MENU_ID_HELP, 2, "Help");
		menu.add(Menu.NONE, MENU_ID_EXIT, 3, "Exit");
		return super.onCreateOptionsMenu(menu);
	}

	/**
	 * オプションメニューが表示される度に呼び出されます
	 */
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		return super.onPrepareOptionsMenu(menu);
	}

	/**
	 * オプションメニューアイテムが選択された時に呼び出されます
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		boolean ret = true;
		switch (item.getItemId()) {
		default:
			ret = super.onOptionsItemSelected(item);
			break;
		case MENU_ID_SEARCH:
			showSearchDialog();
			break;
		case MENU_ID_RADAR:
			showRadarAlphaDialog();
			//mapView.setOverlayAlpha(255);
			ret = true;
			break;
		case MENU_ID_HELP:
			showHelpDialog();
			ret = true;
			break;
		case MENU_ID_EXIT:
			view.halt();
			finish();
			ret = true;
			break;
		}
		return ret;
	}

	/**
	 * ダイアログ表示メソッド
	 * @param title ダイアログのタイトル
	 * @param mes メッセージ
	 */
	private void showDialog(String title, String mes) {
		AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
		alertDialogBuilder.setTitle(title);
		alertDialogBuilder.setMessage(mes);
		alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// do nothing
			}
		});
		alertDialogBuilder.setCancelable(true);
		AlertDialog alertDialog = alertDialogBuilder.create();
		alertDialog.show();
	}
	
	/**
	 * ヘルプ(Version) ダイアログ
	 * メニューのヘルプが選択された際に実行する
	 */
	private void showHelpDialog() {
		showDialog("DRadar", "Version 0.0");
	}

	/**
	 * 検索ダイアログの表示
	 */
	private void showSearchDialog() {

		edit = new EditText(this);

		AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
		alertDialogBuilder.setTitle("Search");
		alertDialogBuilder.setMessage("Input Your DragonBall!");
		alertDialogBuilder.setView(edit);
		alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// ここで、ぐるなびAPIへ検索を投げる
				Log.v("Test", "onclick");
				DragonData data = DragonData.getInstance();
				data.search(edit.getText().toString(), lat, lng);
			}
		});
		alertDialogBuilder.setCancelable(true);

		AlertDialog alertDialog = alertDialogBuilder.create();
		alertDialog.show();
	}
	
	private void showRadarAlphaDialog(){
		
		//アルファチャンネル調整用シークバー
		seekBar = new SeekBar(this);
		seekBar.setMax(255);
		seekBar.setProgress(mapView.getCurrentAlpha());
		seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
			
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				// TODO 自動生成されたメソッド・スタブ
				Log.v("Tag", "stop");
				
			}
			
			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO 自動生成されたメソッド・スタブ
				Log.v("Tag", "start");
			}
			
			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO 自動生成されたメソッド・スタブ
				Log.v("Tag", "progress");
				mapView.setOverlayAlpha(seekBar.getProgress());
			}
		});

		AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
		alertDialogBuilder.setTitle("Radar");
		alertDialogBuilder.setMessage("Radar Alpha Channel");
		alertDialogBuilder.setView(seekBar);
		alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// do nothing
			}
		});
		alertDialogBuilder.setCancelable(true);

		AlertDialog alertDialog = alertDialogBuilder.create();
		alertDialog.show();
	}
}